package com.itheima.controller;

import com.itheima.pojo.User;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;

@RestController
public class RequestController {

    /*
        简单参数处理方式
        需求1 : 定义simpleParam方法 , 使用原始方式完成简单参数接收
     */
    //原始方式
//    @RequestMapping("/simple")
//    public String simpleParm(HttpServletRequest request){
//          String name = request.getParameter("name");
//          String age = request.getParameter("age");
//          System.out.println(name + "-------" + age);
//          return "ok"
//
//    }

    //Springboot
    @RequestMapping("/simple")
    public String simpleParm(String name, int age) {
        System.out.println(name + "-------" + age);
        return "ok";
    }

    /*
       简单参数处理方式
           1 : 参数名与形参变量名相同，定义形参即可接收参数
           2 : 类型可以自动类型转换,基本类型需要使用包装类类型接收
           3 : 如果方法形参名称与请求参数名称不匹配，可以使用 @RequestParam 完成映射
       需求2 :  定义方法simpleParam , 使用SpringBoot方式完成简单参数接收
    */
    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam("name") String name1, @RequestParam("age") Integer age1) {
        System.out.println(name1 + "------" + age1);

        return "ok";
    }


    /*
        简单实体对象案例

        注意 : 简单实体对象：前端传入参数名与 POJO 属性名相同，定义POJO接收即可
        需求3 : 定义User类, User类中包含name和age属性
        定义simplePojo方法 , 使用简单实体对象接收前端数据
     */
    @RequestMapping("/POJO")
    public String POJO(User user) {

        System.out.println(user.toString());
        return "ok";

    }


    /*
       复杂实体对象案例

       注意 : 复杂实体对象：请求参数名与形参对象属性名相同，按照对象层次结构关系即可接收嵌套POJO属性参数。
       需求4 : 定义User类和Address类, User类中包含name和age属性 , Address类中包含province和city属性
       定义complexPojo方法 , 使用复杂实体对象接收前端参数数据
    */
    @RequestMapping("/complexPojo")
    public String ComplexPojo(User user) {
        System.out.println(user.toString());
        return "ok";
    }



    /*
        数组参数：请求参数为多个且参数的键是相同的，定义数组类型形参即可接收参数

        需求5 : 定义arrayParam方法 , 使用数组接收前端参数数据
     */

    @RequestMapping("/arrlist")
    public String arrayParam(String[] hooby) {
        System.out.println(Arrays.toString(hooby));
        return "ok";
    }

    /*
        集合参数：请求参数为多个且参数的键是相同的，使用集合参数接收并使用@RequestParam 绑定参数关系

        需求6 : 定义listParam方法 , 使用集合接收前端参数数据
   */
    @RequestMapping("/listParam")
    public String listParam(@RequestParam List<String> hobby) {
        System.out.println(hobby);
        return "ok";
    }


    /*
        日期参数：前端请求的参数是一个日期, 使用日期参数接收且使用 @DateTimeFormat 注解完成日期参数格式转换

        需求7 : 定义dateParam方法 , 使用LocalDateTime接收前端参数数据
     */
    @RequestMapping("/dateParam")
    public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime) {
        System.out.println(updateTime);
        return "ok";
    }

    /*
        JSON参数：请求参数是JSON数据, 使用POJO类型接收参数。需使用 @RequestBody 标识

        需求8 : 定义jsonParam方法 , 使用实体类对象接收前端参数数据
     */
    @RequestMapping("/jsonParam")
    public String jsonParam(@RequestBody User user) {
        System.out.println(user);
        return "ok";
    }


    /*
        路径参数：通过请求URL直接传递参数，使用{…}来标识该路径参数，需要使用 @PathVariable 获取路径参数

        需求9 : 定义pathParam方法 , 使用{…}来接收传递过来的参数
     */
    @RequestMapping("/pathParam/{first}/{two}")
    public String pathParam(@PathVariable String first , @PathVariable Integer two) {
        System.out.println(first);
        System.out.println(two);
        return "ok";
    }


}
